<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>轻量 搜索 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/search-lite.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/search-lite.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="search.html">搜索——最基本的工具</a></span>
»
<span class="breadcrumb-node"><em>轻量</em> 搜索</span>
</div>
<div class="navheader">
<span class="prev">
<a href="pagination.html">« 分页</a>
</span>
<span class="next">
<a href="mapping-analysis.html">映射和分析 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-lite"></a><em>轻量</em> 搜索<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/050_Search/20_Query_string.asciidoc">edit</a>
</h2>
</div></div></div>
<p>有两种形式的 <code class="literal">搜索</code> API：一种是 “轻量的” <em>查询字符串</em> 版本，要求在查询字符串中传递所有的参数，另一种是更完整的 <em>请求体</em> 版本，要求使用 JSON 格式和更丰富的查询表达式作为搜索语言。</p>
<p>查询字符串搜索非常适用于通过命令行做即席查询。例如，查询在 <code class="literal">tweet</code> 类型中 <code class="literal">tweet</code> 字段包含 <code class="literal">elasticsearch</code> 单词的所有文档：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_all/tweet/_search?q=tweet:elasticsearch</pre>
</div>
<div class="sense_widget" data-snippet="snippets/050_Search/20_Query_string.json"></div>
<p>下一个查询在 <code class="literal">name</code> 字段中包含 <code class="literal">john</code> 并且在 <code class="literal">tweet</code> 字段中包含 <code class="literal">mary</code> 的文档。实际的查询就是这样</p>
<pre class="literallayout">+name:john +tweet:mary</pre>

<p>但是查询字符串参数所需要的 <em>百分比编码</em> （译者注：URL编码）实际上更加难懂：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary</pre>
</div>
<div class="sense_widget" data-snippet="snippets/050_Search/20_Query_string.json"></div>
<p><code class="literal">+</code> 前缀表示必须与查询条件匹配。类似地， <code class="literal">-</code> 前缀表示一定不与查询条件匹配。没有 <code class="literal">+</code> 或者 <code class="literal">-</code> 的所有其他条件都是可选的——匹配的越多，文档就越相关。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="all-field-intro"></a>_all 字段<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/050_Search/20_Query_string.asciidoc">edit</a>
</h3>
</div></div></div>
<p>这个简单搜索返回包含 <code class="literal">mary</code> 的所有文档：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_search?q=mary</pre>
</div>
<div class="sense_widget" data-snippet="snippets/050_Search/20_All_field.json"></div>
<p>之前的例子中，我们在 <code class="literal">tweet</code> 和 <code class="literal">name</code> 字段中搜索内容。然而，这个查询的结果在三个地方提到了 <code class="literal">mary</code> ：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
有一个用户叫做 Mary
</li>
<li class="listitem">
6条微博发自 Mary
</li>
<li class="listitem">
一条微博直接 @mary
</li>
</ul>
</div>
<p>Elasticsearch 是如何在三个不同的字段中查找到结果的呢？</p>
<p>当索引一个文档的时候，Elasticsearch 取出所有字段的值拼接成一个大的字符串，作为 <code class="literal">_all</code> 字段进行索引。例如，当索引这个文档时：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "tweet":    "However did I manage before Elasticsearch?",
    "date":     "2014-09-14",
    "name":     "Mary Jones",
    "user_id":  1
}</pre>
</div>
<p>这就好似增加了一个名叫 <code class="literal">_all</code> 的额外字段：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"</pre>
</div>
<p>除非设置特定字段，否则查询字符串就使用 <code class="literal">_all</code> 字段进行搜索。</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>在刚开始开发一个应用时，<code class="literal">_all</code> 字段是一个很实用的特性。之后，你会发现如果搜索时用指定字段来代替 <code class="literal">_all</code> 字段，将会更好控制搜索结果。当 <code class="literal">_all</code> 字段不再有用的时候，可以将它置为失效，正如在 <a class="xref" href="root-object.html#all-field" title="元数据: _all 字段">元数据: _all 字段</a> 中所解释的。</p>
</div>
</div>
</div>

<div class="section pagebreak-before">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="query-string-query"></a>更复杂的查询<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/050_Search/20_Query_string.asciidoc">edit</a>
</h3>
</div></div></div>
<p>下面的查询针对tweents类型，并使用以下的条件：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">name</code> 字段中包含 <code class="literal">mary</code> 或者 <code class="literal">john</code>
</li>
<li class="listitem">
<code class="literal">date</code> 值大于 <code class="literal">2014-09-10</code>
</li>
<li class="listitem">
<code class="literal">_all</code> 字段包含 <code class="literal">aggregations</code> 或者 <code class="literal">geo</code>
</li>
</ul>
</div>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">+name:(mary john) +date:&gt;2014-09-10 +(aggregations geo)</pre>
</div>
<div class="sense_widget" data-snippet="snippets/050_Search/20_All_field.json"></div>
<p>查询字符串在做了适当的编码后，可读性很差：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)</pre>
</div>
<p>从之前的例子中可以看出，这种 <em>轻量</em> 的查询字符串搜索效果还是挺让人惊喜的。 它的查询语法在相关参考文档中有详细解释，以便简洁的表达很复杂的查询。对于通过命令做一次性查询，或者是在开发阶段，都非常方便。</p>
<p>但同时也可以看到，这种精简让调试更加晦涩和困难。而且很脆弱，一些查询字符串中很小的语法错误，像 <code class="literal">-</code> ， <code class="literal">:</code> ， <code class="literal">/</code> 或者 <code class="literal">"</code> 不匹配等，将会返回错误而不是搜索结果。</p>
<p>最后，查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量级的查询，这可能会暴露隐私信息，甚至将集群拖垮。</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>因为这些原因，不推荐直接向用户暴露查询字符串搜索功能，除非对于集群和数据来说非常信任他们。</p>
</div>
</div>
<p>相反，我们经常在生产环境中更多地使用功能全面的 <em>request body</em> 查询API，除了能完成以上所有功能，还有一些附加功能。但在到达那个阶段之前，首先需要了解数据在 Elasticsearch 中是如何被索引的。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="pagination.html">« 分页</a>
</span>
<span class="next">
<a href="mapping-analysis.html">映射和分析 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>